﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace WinCourseControls
{
    public partial class FrmChart02 : Form
    {
        public FrmChart02()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 图表数据加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmChart02_Load(object sender, EventArgs e)
        {
            #region 柱状图
            chart1.Series.Clear();//清空序列集合
            chart1.Legends.Clear();//清空图例集合
            List<ProQulityInfo> list = new List<ProQulityInfo>()  //  默认产品产量数据
            {
                new ProQulityInfo(){Month="2021-04",Va1=69,Va2=96,Va3=66},
                 new ProQulityInfo(){Month="2021-05",Va1=88,Va2=120,Va3=78},
                  new ProQulityInfo(){Month="2021-06",Va1=75,Va2=100,Va3=98},
                   new ProQulityInfo(){Month="2021-07",Va1=89,Va2=75,Va3=100}
            };
            #region 设置图表区的样式
            // 使用chart1.ChartAreas[0] 是因为默认有一个图表区
            //chart1.ChartAreas[0].BackColor = Color.Gray; // 设置图表区背景色
            chart1.ChartAreas[0].Name = "ProductQulityArea";  // 设置图表区名称
            chart1.ChartAreas[0].Area3DStyle.Enable3D = false;//不启用 - 是否启用3D样式
            //设置图表区x y轴样式
            chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = true; // 是否启用X轴网格
            chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = true; // 是否启用Y轴网格
            chart1.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;//设置Y轴网络线的样式
            chart1.ChartAreas[0].AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Solid;//设置X轴网络线的样式
            chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;//设置X轴网格线的颜色
            chart1.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;//设置X轴是否显示刻度线
            chart1.ChartAreas[0].AxisY.MajorTickMark.Enabled = false;// 设置Y轴是否显示刻度线
            chart1.ChartAreas[0].AxisY.IsInterlaced = true; // 设置Y轴是否启用交错带
            chart1.ChartAreas[0].AxisY.InterlacedColor = Color.LightBlue;//设置Y轴交错带的颜色
            chart1.ChartAreas[0].AxisY.Title = "产量"; // 设置Y轴标题
            chart1.ChartAreas[0].AxisX.Title = "月份"; // 设置X轴标题
            chart1.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Far; // 设置X轴标题对齐方式
            chart1.ChartAreas[0].AxisY.TitleAlignment = StringAlignment.Far;// 设置Y轴标题对齐方式
            chart1.ChartAreas[0].AxisY.Interval = 20; // 设置Y轴的间隔
            #endregion

            //数据源
            chart1.DataSource = list;

            //创建序列
            //柱型图
            Series series01 = new Series(); // 创建序列
            chart1.Series.Add(series01);//添加序列
            series01.ChartArea = chart1.ChartAreas[0].Name;//设置序列属于那个图表区
            series01.ChartType = SeriesChartType.Column;//柱形图 - 设置图表序列类型
            series01.Label = "#VAL";// 显示点的Y值 - 设置柱状图顶部显示的文本值
            series01.XValueType = ChartValueType.String;//设置x轴值类型
            series01.YValueType = ChartValueType.Int32;//设置x轴值类型
            series01["PointWidth"] = "0.5"; // 设置柱形图 - 柱子宽度 
            series01.XValueMember = "Month"; // 设置X轴数据源绑定的字段
            series01.YValueMembers = "Va1"; // 设置Y轴数据源绑定的字段
            series01.LegendText = "材料1"; // 设置图例文本显示名称

            //创建图例
            Legend legend01 = new Legend(); // 创建图例
            legend01.Title = "产品材料产量"; // 设置图例标题名称
            chart1.Legends.Add(legend01); // 添加图例
            legend01.Alignment = StringAlignment.Near; // 设置图例对齐方式
            legend01.Docking = Docking.Right; // 设置图例停靠位置
            series01.Legend = legend01.Name;//设置序列的图例 - 设置序列使用哪个图例

            // 创建序列 
            Series series02 = new Series(); 
            chart1.Series.Add(series02);//添加第二个序列
            series02.ChartArea = chart1.ChartAreas[0].Name;//设置所在的图表区
            series02.ChartType = SeriesChartType.Column;//柱形图
            series02.Label = "#VAL";//显示点的Y值
            series02.XValueType = ChartValueType.String;//x轴值类型
            series02.YValueType = ChartValueType.Int32;//x轴值类型
            series02["PointWidth"] = "0.5";
            series02.XValueMember = "Month";
            series02.YValueMembers = "Va2";
            series02.LegendText = "材料2";
            series02.Legend = legend01.Name; // 设置序列使用哪个图例

            // 创建序列
            Series series03 = new Series();
            chart1.Series.Add(series03);//添加序列
            series03.ChartArea = chart1.ChartAreas[0].Name;//设置所在的图表区
            series03.ChartType = SeriesChartType.Column;//柱形图
            series03.Label = "#VAL";//显示点的Y值
            series03.XValueType = ChartValueType.String;//x轴值类型
            series03.YValueType = ChartValueType.Int32;//x轴值类型
            series03.BorderWidth = 4;
            series03.XValueMember = "Month";
            series03.YValueMembers = "Va3";
            series03.LegendText = "材料3";
            series03.Legend = legend01.Name;
            #endregion

            #region 折线图
            //Chart2 - 创建图表区 - 折线图
            chart2.ChartAreas.Clear(); // 清空图表
            ChartArea area2 = new ChartArea("ClassArea"); // 创建图表 - ClassArea:设置图表区名称 - 用于折线图图表
            chart2.ChartAreas.Add(area2);//添加图表区
            // 这里边0表示X轴-1表示Y轴 - 与使用AxisX、AxisY是相同效果
            chart2.ChartAreas[0].Axes[0].MajorGrid.Enabled = true; // 设置是否启用网格线
            chart2.ChartAreas[0].Axes[1].MajorGrid.Enabled = true; // 设置是否启用网格线
            chart2.ChartAreas[0].Axes[0].MajorGrid.LineDashStyle = ChartDashStyle.Dash; // 设置网格线类型
            chart2.ChartAreas[0].Axes[0].MajorGrid.LineColor = Color.Gray; // 设置网格线颜色
            chart2.ChartAreas[0].Axes[0].MajorTickMark.Enabled = true; // 设置X轴是否启用刻度线 x轴上突出的小点
            chart2.ChartAreas[0].Axes[1].MajorTickMark.Enabled = true; // 设置Y轴是否启用刻度线
            chart2.ChartAreas[0].Axes[1].IsInterlaced = false; //显示交错带
            chart2.ChartAreas[0].Axes[0].Title = "班级"; //设置X轴标题名称
            chart2.ChartAreas[0].Axes[1].MajorGrid.LineDashStyle = ChartDashStyle.Dash; //网格类型 短横线
            chart2.ChartAreas[0].Axes[1].MajorGrid.LineColor = Color.Blue; // 设置网格线颜色
            chart2.ChartAreas[0].Axes[1].MajorGrid.LineWidth = 1; // 设置网格线粗细
            chart2.ChartAreas[0].Axes[1].Interval = 10; // 
            chart2.ChartAreas[0].Axes[1].Title = "人数"; //设置y轴标题名称
            List<ClassInfo> classList = GetClassInfos();//班级数据 - 获取数据源
            chart2.DataSource = classList; // 绑定数据源
            chart2.Series.Clear(); // 清空序列

            // 创建序列
            Series series04 = new Series(); // 创建序列
            chart2.Series.Add(series04);//添加序列 - 添加序列到图表2
            series04.ChartArea = chart2.ChartAreas[0].Name;//设置序列属于那个图表
            series04.ChartType = SeriesChartType.Line;//折线图
            series04.Label = "人数：#VAL";//显示点的Y值 - 折线图点位置显示的文本
            series04.XValueType = ChartValueType.String;//x轴值类型
            series04.YValueType = ChartValueType.Int32;//x轴值类型
            series04.XValueMember = "ClassName"; // X轴显示文本在数据源中对应的字段
            series04.YValueMembers = "StuCount"; // Y轴显示的文本在数据源中对应的字段
            series04.BorderWidth = 4;//线的粗细 - 设置折线粗细
            series04.LegendText = "班级人数"; // 设置图例文本显示名称
         

            //创建图例
            Legend legend02= new Legend(); // 创建图例
            legend02.Title = "班级信息"; // 设置图例标题
            chart2.Legends.Add(legend02); // 添加图例
            legend02.Alignment = StringAlignment.Near; // 设置图例对齐方式
            legend02.Docking = Docking.Right; // 设置图例停靠位置
            series04.Legend = legend02.Name;//设置设置04序列应用这个图例
            #endregion

            #region 饼状图
            // 饼状图不需要添加X轴Y轴序列
            chart3.ChartAreas.Clear(); // 清空图表区
            chart3.Series.Clear(); // 清空图表序列
            ChartArea area3 = new ChartArea("ClassPieArea"); // 实例化图表-并设置图表名称
            chart3.ChartAreas.Add(area3); //添加图表区
            chart3.DataSource = classList; // 绑定数据源

            // 创建序列
            Series series05 = new Series(); // 实例化序列
            chart3.Series.Add(series05); //添加序列
            series05.ChartArea = chart3.ChartAreas[0].Name;//设置所在的图表区
            series05.ChartType = SeriesChartType.Pie;//饼形图 - 设置图表类型
            series05.Label = "#PERCENT{P}";//显示百分比 设置文本显示格式
            series05.XValueType = ChartValueType.String;//x轴值类型
            series05.YValueType = ChartValueType.Double;//x轴值类型
            series05.XValueMember = "ClassName"; // 设置X轴在数据源中对应的字段
            series05.YValueMembers = "GoodsScoresPercent"; // 设置Y轴在数据源的对应的字段
            series05.LegendText = "#VALX";//班级名称  - 设置图例文本名称
            // 饼形图有可能显示不全-所以增加提示信息-#VALX 表示X轴的XValueMember的值，#VAL表示Y轴的YValueMembers的值。
            series05.ToolTip = "#VALX 优等成绩占有：#VAL %";  
            series05["PieLabelStyle"] = "OutSide"; // 将饼形图的百分比显示在饼形图的外边

            // 创建图例
            Legend legend03 = new Legend(); // 实例化饼形图的图例
            legend03.Title = "优等成绩占有率"; // 设置图例标题
            chart3.Legends.Add(legend03); //添加图列到饼形图
            legend03.Alignment = StringAlignment.Near; // 设置图例对齐方式
            legend03.Docking = Docking.Right; // 设置图例停靠位置
            series05.Legend = legend03.Name;//设置序列的图例 设置饼形图序列使用这个图例
            #endregion

            #region 环形图
            chart4.ChartAreas.Clear(); // 清空图表区
            chart4.Series.Clear(); // 清空图表序列
            ChartArea area4 = new ChartArea("ClassDoughnutArea"); // 实例化图表区-设置图表区名称
            chart4.ChartAreas.Add(area4);//添加图表区到图表中
            chart4.DataSource = classList; // 绑定数据源
            // 环形图不需要添加X轴Y轴序列。

            // 创建序列
            Series series06 = new Series(); // 实例化序列
            chart4.Series.Add(series06);//添加序列到图表中
            series06.ChartArea = area4.Name;//设置所在的图表区 - 设置序列属于哪个图表区
            series06.ChartType = SeriesChartType.Doughnut; //环形图表
            series06.Label = "#PERCENT{P}";//显示百分比 设置文本显示格式
            series06.XValueType = ChartValueType.String;//x轴值类型
            series06.YValueType = ChartValueType.Double;//x轴值类型
            series06.XValueMember = "ClassName"; // 设置X轴在数据源中对应的字段
            series06.YValueMembers = "GoodsScoresPercent"; // 设置Y轴在数据源中对应的字段
            series06.LegendText = "#VALX";//班级名称 - 设置图例名称 - #VALX表示Y轴的XValueMember字段值
            // 环形图有可能显示不全-所以增加提示信息-#VALX 表示X轴的XValueMember的值，#VAL表示Y轴的YValueMembers的值。
            series06.ToolTip = "#VALX 优等成绩占有：#VAL %";

            // 创建图例
            Legend legend04 = new Legend(); // 实例化图例
            legend04.Title = "优等成绩占有率"; // 设置图例标题
            chart4.Legends.Add(legend04); // 添加图例到图表中
            legend04.Alignment = StringAlignment.Near; // 设置图例的对齐方式
            legend04.Docking = Docking.Right; // 设置图例的停靠位置
            series06.Legend = legend04.Name;//设置序列的图例 - 设置那个序列应用的这个图例
            #endregion
        }

        /// <summary>
        /// 模拟班级数据
        /// </summary>
        /// <returns></returns>
        private List<ClassInfo> GetClassInfos()
        {
            return new List<ClassInfo>()
            {
                new ClassInfo(){ClassId =1,ClassName="一班",StuCount =33,GoodsScoresPercent=15},
                new ClassInfo(){ClassId =2,ClassName="二班",StuCount =45,GoodsScoresPercent=26.8},
                new ClassInfo(){ClassId =3,ClassName="三班",StuCount =40,GoodsScoresPercent=34.2},
                new ClassInfo(){ClassId =4,ClassName="四班",StuCount =48,GoodsScoresPercent=10},
                new ClassInfo(){ClassId =5,ClassName="五班",StuCount =35,GoodsScoresPercent=8},
                new ClassInfo(){ClassId =6,ClassName="六班",StuCount =46,GoodsScoresPercent =6}
            };
        }
    }

    /// <summary>
    /// 班级信息
    /// </summary>
    public class ClassInfo
    {
        /// <summary>
        /// 班级ID
        /// </summary>
        public int ClassId { get; set; }
        /// <summary>
        /// 班级名称
        /// </summary>
        public string ClassName { get; set; }
        /// <summary>
        /// 班级人数
        /// </summary>
        public int StuCount { get; set; }
        /// <summary>
        /// 班级优等生所占比例
        /// </summary>
        public double GoodsScoresPercent { get; set; }
    }

    /// <summary>
    /// 产品材料产量
    /// </summary>
    public class ProQulityInfo
    {
        /// <summary>
        /// 月份
        /// </summary>
        public string Month { get; set; }
        /// <summary>
        /// 产品1
        /// </summary>
        public int Va1 { get; set; }
        /// <summary>
        /// 产品2
        /// </summary>
        public int Va2 { get; set; }
        /// <summary>
        /// 产品3
        /// </summary>
        public int Va3 { get; set; }
    }
}
